<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>

        // Object.is() 从应用功能上的描述和===基本一致，仅在+0和-0、NaN和NaN比较上存在差异
        console.log(NaN===NaN);//false
        console.log(+0===-0);//true
        console.log(Object.is(NaN,NaN));//true
        console.log(Object.is("vvv"*3,"bnnm"*4));//true
        console.log(Object.is(+0,-0));//false

        // Object.assign(target,source......)用于将对象中所有可循环的属性，从一个对象或多个对象复制到新的对象中
        // target描述承载复制结果的新对象，目标对象中的属性会被后续的对象中同名属性覆盖
        // source指定复制的对象列表，如果完成多个对象的合并，后续对象中的属性会覆盖前面对象中的同名属性
        var obj1={username:"alice",age:20};
        var obj2={a:1001,b:2000,arrs:["aa","bb","cc"],username:"冯绍峰"};
        var obj3={height:180,sex:"女",username:"赵丽颖"};
        Object.assign(obj1,obj2,obj3);
        
        obj1.arrs[1]="嘻嘻";
        console.log(obj2);//实现的浅拷贝
        console.log(obj1);

        // Object.keys(对象)获取指定对象中所有可循环的属性名，并返回构成属性名列表
        // Object.values(对象)获取指定对象中所有可循环的属性值，并返回构成属性值的列表
        // Object.entries()获取指定对象中所有可循环的属性名和属性值，并返回构成构成列表[[属性名,属性值],[属性名,属性值],[属性名,属性值]]
        // Object.fromEntries()将对象(二维数组)的构成列表转换成js的标准的对象结构
        var objs={
            username:"alice",
            age:20,
            sex:"男"
        };

        Object.defineProperty(objs,"hobby",{
            value:"打游戏",
            writable:true,//如果是false，不允许修改属性值
            enumerable:true,//如果是false，不允许被循环遍历到
            configurable:true//如果是false，不允许被删除
        });
        console.log(Object.keys(objs));
        console.log(Object.values(objs));
        console.log(Object.entries(objs));

        var arrays=Object.entries(objs);//二维数组
        var newObj=Object.fromEntries(arrays);
        console.log(newObj);
    </script>
</head>
<body>
    
</body>
</html>